Nebula 基本介绍

疑问点:

  1. 后端通过什么方式写入?spark、flink

  2. 支持事务吗?不支持写入的事务,只有边存储的事务一致性

简介

什么是图数据库

图数据库是专门存储庞大的图形网络并从中检索信息的数据库。它可以将图中的数据高效存储为点(Vertex)和边(Edge),还可以将属性(Property)附加到点和边上。

什么是Nebula Graph

Nebula Graph 是一款开源的、分布式的、易扩展的原生图数据库,能够承载数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。

基本概念

数据模型

图空间(Space): 相当于oracle的表空间
点(Vertex):实体对象,唯一标识符VID,至少有一个Tag
标签(Tag):描述点的预定义属性
属性(Properties):存储的键值对信息,点和边都可以添加
边(Edge):连接点,表示点之间的关系或行为(无限、有向、有类型、有rank)
边类型(Edge type):描述边的预定义属性

Nebula Graph 目前版本中允许存在”悬挂边”,因此在增删时,用户需自行保证“一条边所对应的起点和终点”的存在性。

运算符

管道符|: 组合查询
引用符
​ $^: 起始点
​ $$: 目的点
​ $-: 管道符之前的输出

schema函数

函数说明
id(vertex)返回点 ID。数据类型和点 ID 的类型保持一致。
properties(vertex)返回点的所有属性。
properties(edge)返回边的所有属性。
type(edge)返回边的 Edge type。
src(edge)返回边的起始点 ID。数据类型和点 ID 的类型保持一致。
dst(edge)返回边的目的点 ID。数据类型和点 ID 的类型保持一致。
rank(edge)返回边的 rank。

路径

walk:点和边都可以重复(go)
trail:点可以重复,边不能重复(match)
path:点和边都不可以重复

图模式

点:(a)
线:()-[b:serve]->()
tag:(a: player)
属性:(a: player{name: “james”})
长度:()-[*2..4]->()

nGQL

新增、修改、删除

图空间: create space basketball(vid_type=fixed_string(64))
Tag: create tag player(name string, age int);
​ drop tag player;
​ alter tag player add (salary double);
Edge Type: create edge follow(degree int);
​ drop edge follow;
​ alter edge follow(year int);
点: insert vertex player(name, age) values “player001”:(“james”, 25);
​ delete vertex “player001”;
​ update vertex on player “player001” set age = 35;
​ upsert vertex on player “player002” set name = “curry”, age = 32;
边: insert edge follow(degree) values “player001”->“player100”:(75);
​ delete edge follow “player001” -> “player100”;
​ update edge on follow” “player001” -> “player100” set degree = degree + 1;
​ upsert edge on follow” “player001” -> “player100” set degree = degree + 1;

修改是异步的,需要等待2个心跳周期才能确保生效

查询

match

根据模式进行匹配
MATCH [] RETURN ;
例:
MATCH (v:player) <-[]- (v2) WHERE id(v) == "player100" RETURN v2;

lookup

遍历点或者边
例:
lookup on player where player.name == "james"

go

遍历图
例:
GO FROM "player100" OVER follow REVERSELY \
YIELD src(edge) AS id | \
GO FROM $-.id OVER serve \
WHERE $^.player.age > 20 \
YIELD properties($^).name AS FriendOf, properties($$).name AS Team;

fetch

获取点或边的属性值
例:
fetch prop on player "player100" yield properties(vertex).name as name;

子句

group by

group by … yield …
支持的函数:avg(), sum(), max(), min(), count(), collect(), std();
例:
go from "player100" over follow yield properties($$).name as name | \

group by $-.name yield $-.name as player, count(*) as count;

limit

与mysql基本一致

skip

从指定位置开始

sample

与GO中的step组合,表示每一步遍历时选择几条边进行遍历
GO 1 TO 3 STEPS FROM "player100" \
OVER * \
YIELD properties($$).name AS NAME, properties($$).age AS Age \
SAMPLE [1,2,3];
第一跳遍历时,只选择1条边
第二跳遍历时,只选择2条边
第三跳遍历时,只选择3条边

order by

排序,必须在yield和管道符之后

return

返回结果

ttl

属性存活时间,到期后属性被删除

where

条件

yield

定义输出结果

Nebula Graph部署

下载

修改配置文件

nebula-grahd.conf、nebula-metad.conf、nebula-storaged.conf

将nebula-grahd.conf.default、nebula-metad.conf.default、nebula-storaged.conf.default文件修改为nebula-grahd.conf、nebula-metad.conf、nebula-storaged.conf
修改:
########## networking ##########
--meta_server_addrs=rabbitmq1:9559,rabbitmq2:9559
--local_ip=rabbitmq2
rabbitmq1中将local_ip修改为rabbitmq1

启动

授权
$ chmod -R 755 scripts
$ chmod -R 755 bin
启动服务
$ sh scripts/nebula.service start all
$ sh scripts/nebula.service status all

使用

连接控制台
[talkwebhzj@rabbitmq2 /]$ nebula-console -addr rabbitmq2 -port 9669 -u root -p 123
查询
(nebula) > USE basketballplayer;
(nebula) > GO FROM "player100" OVER follow;